/*
    This file is part of QTau
    Copyright (C) 2013-2018  Tobias "Tomoko" Platen <tplaten@posteo.de>
    Copyright (C) 2013       digited       <https://github.com/digited>
    Copyright (C) 2010-2013  HAL@ShurabaP  <https://github.com/haruneko>

    QTau is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

    SPDX-License-Identifier: GPL-3.0+
*/

#ifndef LESYNTH_H
#define LESYNTH_H

#include "PluginInterfaces.h"
#include <QJsonArray>
#include <QList>
#include <QMap>

#include "jack/ringbuffer.h"

#include "sndfile.h"

#include <QThread>
#include <QMap>
#include <QString>
#include <QStringList>



class FestvoxSynth : public QObject, public ISynth
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID c_isynth_comname FILE "festvox_synth.json")
    Q_INTERFACES(ISynth)


public:
    FestvoxSynth() {}

    //plugin loading
    QString name()                              override;
    QString description()                       override;
    QString version()                           override;
    void setup(IController *ctrl)               override;

    //synth base
    bool setCacheDir(QString cacheDir)          override;
    bool synthesize(IScore* score)              override;
    bool synthIsRealtime()                      override;
    int readData(float *data, int size)         override;



    //lyricizer
    QString getTranscription(QString txt)       override;
    bool doPhonemeTransformation(QStringList& lyrics) override;

    //voice manager
    bool setVoice(QString voiceName) override;
    QStringList listVoices() override;


private:
    void buildScore();
    void scanUtauDir();
    void synthThread();




private:
    IController* _ctrl;
    int _jack_samplerate;

signals:
    void endOfThread();
    void logError(QString error);
    void logSuccess(QString success);
    void logDebug(QString debug);

public slots:
    void on_logError(QString error);
    void on_logSuccess(QString success);
    void on_logDebug(QString debug);
    void on_endOfThread();

};

#define SETSEEK 1
#endif // LESYNTH_H
